package main

import (
	"os"
	"fmt"
	"github.com/hpcloud/tail"
	"time"
	"strings"
)

func main () {
	filename := "tailf_test.txt"  // 指定查看哪个文件
	tails, err := tail.TailFile(filename, tail.Config{
		// 下面的2行配置，相当于命令 tail -F 的效果
		// 追踪文件并保持重试，即该文件被删除或改名后，如果再次创建相同的文件名，会继续追踪。
		ReOpen: true,
		Follow: true,

		Location: &tail.SeekInfo{Offset: 0, Whence: os.SEEK_END},  // 从哪个位置开始读，这里的设置是从文件结尾
		MustExist: false,  // 如果文件不存在，会失败。这是设为fales，允许文件不存在，等文件一创建就会开始追踪
		Poll: true,  // 设为true，检查文件的变化。false是通过inotify来检查
	})
	if err != nil {
		fmt.Fprintf(os.Stderr, "tail file: %s , ERROR: %v\n", tails.Filename, err)
	}
	for {
		msg, ok := <-tails.Lines
		if ! ok {
			fmt.Fprintf(os.Stderr, "文件不存在，尝试重新打开文件: %s", tails.Filename)
			time.Sleep(time.Millisecond * 1000)
			continue
		}
		fmt.Println("msg:", msg.Text)
		fmt.Println("time:", msg.Time)
		// windows系统里的换行是\r\n，输出的时候可能只去掉了\n，导致字符串会以\r结尾
		// 如果以\r结尾，后面还有字符串的话，就会从头开始把之前的内容覆盖掉
		fmt.Printf("%q\n", msg.Text)  // 输出有问题的原因是这样的，这里可以看出来
		// 可以手动把 msg.Text 最后的 \r 去掉，即使没有，也不影响
		fmt.Printf("msg: %s time: %s\n", strings.TrimRight(msg.Text, "\r"), msg.Time)
	}
}